all repos — caroster @ c45e87f1213a8a980ac0fc9fe510f124f5e1a225

[Octree] Group carpool to your event https://caroster.io

frontend/pages/e/[uuid]/waitingList.tsx (view raw)

 1import {useState, useMemo, PropsWithChildren} from 'react';
 2import useProfile from '../../../hooks/useProfile';
 3import WaitingList from '../../../containers/WaitingList';
 4import pageUtils from '../../../lib/pageUtils';
 5import EventLayout, {TabComponent} from '../../../layouts/Event';
 6import {AddPassengerToWaitingList} from '../../../containers/NewPassengerDialog';
 7import {EventByUuidDocument} from '../../../generated/graphql';
 8
 9interface NewPassengerDialogContext {
10  addSelf: boolean;
11}
12
13interface Props {
14  eventUUID: string;
15  announcement?: string;
16}
17
18const Page = (props: PropsWithChildren<Props>) => {
19  return <EventLayout {...props} Tab={WaitingListTab} />;
20};
21
22const WaitingListTab: TabComponent = ({event}) => {
23  const {userId} = useProfile();
24  const [addPassengerToWaitingListContext, toggleNewPassengerToWaitingList] =
25    useState<NewPassengerDialogContext | null>(null);
26
27  const registered = useMemo(() => {
28    if (!userId) return false;
29    const isInWaitingList = event?.waitingPassengers?.data?.some(
30      passenger => passenger.attributes.user?.data?.id === `${userId}`
31    );
32    return isInWaitingList;
33  }, [event, userId]);
34
35  return (
36    <>
37      <WaitingList
38        registered={registered}
39        canAddSelf={!!userId}
40        getToggleNewPassengerDialogFunction={(addSelf: boolean) => () =>
41          toggleNewPassengerToWaitingList({addSelf})}
42      />
43      {!!addPassengerToWaitingListContext && (
44        <AddPassengerToWaitingList
45          open={!!addPassengerToWaitingListContext}
46          toggle={() => toggleNewPassengerToWaitingList(null)}
47          addSelf={addPassengerToWaitingListContext.addSelf}
48        />
49      )}
50    </>
51  );
52};
53
54export const getServerSideProps = pageUtils.getServerSideProps(
55  async (context, apolloClient) => {
56    const {uuid} = context.query;
57    const {host = ''} = context.req.headers;
58    let event = null;
59
60    // Fetch event
61    try {
62      const {data} = await apolloClient.query({
63        query: EventByUuidDocument,
64        variables: {uuid},
65      });
66      event = data?.eventByUUID?.data;
67    } catch (error) {
68      return {
69        notFound: true,
70      };
71    }
72
73    return {
74      props: {
75        eventUUID: uuid,
76        metas: {
77          title: event?.attributes?.name || '',
78          url: `https://${host}${context.resolvedUrl}`,
79        },
80      },
81    };
82  }
83);
84
85export default Page;